package cn.amossun.starter.event.annoation;

import cn.amossun.starter.event.EventDefinition;
import cn.amossun.starter.event.common.Constants;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 事件广播
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface EventMulticaster {

    /**
     * @return the exchanges.
     */
    EventExchange[] exchange() default {};

    /**
     * @return the routing key or pattern for the binding.
     * Multiple elements will result in multiple bindings.
     */
    String key() default Constants.EVENT_ROUTING_KEY;

    /**
     * 事件范围定义
     *
     * @return 事件范围定义
     */
    EventDefinition.Scope definition() default EventDefinition.Scope.DEFAULT;

    /**
     * 是否开启默认Topic消息交换机
     *
     * @return
     */
    boolean defaultTopicExchange() default true;

    /**
     * 是否开启默认头部消息交换机
     *
     * @return
     */
    boolean defaultHeadersExchange() default false;

    /**
     * 当遇到错误时, 是否抛出异常
     *
     * @return 是否抛出异常(PushRemoteEventException)
     */
    boolean thrownException() default true;

    /**
     * 描述
     *
     * @return 描述
     */
    String description() default "";

    /**
     * 超时时间(ms)
     * <p>
     * 超时自动转入超时处理机制
     * RabbitMQ(死信队列处理)
     * </p>
     *
     * @return
     */
    long expiration() default 300L;

    /**
     * 延时时间(s)
     * <p>
     * 延时发送时间
     * </p>
     *
     * @return
     */
    int delay() default 3;

    /**
     * 关联绑定
     *
     * @return
     */
    EventBinding[] bindings() default {};

}
